+# Ensure each subdirectory has exactly one trailing slash.
+subdir-n := $(patsubst %,%/,$(patsubst %/,%,$(subdir-n)))
+subdir-y := $(patsubst %,%/,$(patsubst %/,%,$(subdir-y)))
-subdirs-all := $(subdirs-y) $(subdirs-n)
+# Add explicitly declared subdirectories to the object list.
+obj-y += $(patsubst %,%/built_in.o,$(subdir-y))
-obj-y += $(patsubst %,%/built_in.o,$(subdirs-y))
+# Add implicitly declared subdirectories (in the object list) to the
+# subdirectory list, and rewrite the object-list entry.
+subdir-y += $(filter %/,$(obj-y))
+obj-y := $(patsubst %/,%/built-in.o,$(obj-y))
+
+subdir-all := $(subdir-y) $(subdir-n)
built_in.o: $(obj-y)
$(LD) $(LDFLAGS) -r -o $@ $^
%/built_in.o: FORCE
$(MAKE) -C $*
-clean:: $(addprefix _clean_, $(subdirs-all)) FORCE
+clean:: $(addprefix _clean_, $(subdir-all)) FORCE
rm -f *.o *~ core
_clean_%/: FORCE
$(MAKE) -C $* clean
include $(BASEDIR)/Rules.mk
-subdirs-y += acpi
-subdirs-y += cpu
-subdirs-y += genapic
-subdirs-y += hvm
+subdir-y += acpi
+subdir-y += cpu
+subdir-y += genapic
+subdir-y += hvm
-subdirs-$(x86_32) += x86_32
-subdirs-$(x86_64) += x86_64
+subdir-$(x86_32) += x86_32
+subdir-$(x86_64) += x86_64
obj-y += apic.o
obj-y += audit.o
include $(BASEDIR)/Rules.mk
-subdirs-$(x86_32) += x86_32
-subdirs-$(x86_64) += x86_64
+subdir-$(x86_32) += x86_32
+subdir-$(x86_64) += x86_64
obj-y += emulate.o
obj-y += instrlen.o
include $(BASEDIR)/Rules.mk
-subdirs-$(x86_32) += x86_32
-subdirs-$(x86_64) += x86_64
+subdir-$(x86_32) += x86_32
+subdir-$(x86_64) += x86_64
obj-y += io.o
obj-y += vmcs.o